In [4]:
%matplotlib inline
from functools import cache
import numpy as np
import matplotlib.pyplot as plt
import itertools
import math
from decimal import Decimal, getcontext
from lib import make_pqzo
from collections import deque
In [7]:
def plot(p, q, z, o, k_max):
    fig, ax = plt.subplots()
    x_axis = []
    y_axis_q = []
    y_axis_o = []
    for k in range(k_max):
        x_axis.append(k)
        if k:
            y_axis_o.append(max(abs(o(i, k) - p(i, k)) for i in range(1, 4)))
        else:
            y_axis_o.append(0)
        y_axis_q.append(max(abs(q(i, k) - p(i, k)) for i in range(1, 4)))
    ax.plot(x_axis, y_axis_q, label='q-p')
    ax.plot(x_axis, y_axis_o, label='o-p')
    ax.legend()
    fig.show(warn=False)

def plot_rolling_n(p, q, z, o, k_max, n):
    fig, ax = plt.subplots()
    x_axis = []
    y_axis_q = []
    y_axis_o = []
    last_n_q = deque()
    last_n_o = deque()
    
    for k in range(k_max):
        x_axis.append(k)
        if k:
            last_n_o.append(max(abs(o(i, k) - p(i, k)) for i in range(1, 4)))
        else:
            last_n_o.append(0)
        last_n_q.append(max(abs(q(i, k) - p(i, k)) for i in range(1, 4)))
        
        if len(last_n_o) > n:
            last_n_o.popleft()
            last_n_q.popleft()
        y_axis_q.append(min(last_n_q))
        y_axis_o.append(min(last_n_o))
    
    ax.plot(x_axis, y_axis_q, label='q-p')
    ax.plot(x_axis, y_axis_o, label='o-p')
    ax.legend()
    fig.show(warn=False)
In [3]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot(*make_pqzo(a, 1 - 2*a, a), 100)
In [11]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot_rolling_n(*make_pqzo(a, 1 - 2*a, a), 100, 2)
In [12]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot_rolling_n(*make_pqzo(a, 1 - 2*a, a), 100, 3)
In [13]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot_rolling_n(*make_pqzo(a, 1 - 2*a, a), 100, 4)
In [14]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot_rolling_n(*make_pqzo(a, 1 - 2*a, a), 100, 5)
In [15]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot_rolling_n(*make_pqzo(a, 1 - 2*a, a), 100, 7)
In [17]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot_rolling_n(*make_pqzo(a, 1 - 2*a, a), 100, 10)
In [18]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot_rolling_n(*make_pqzo(a, 1 - 2*a, a), 2000, 10)
In [19]:
getcontext().prec = 2000
for i in range(1, 32, 2):
    a = Decimal(i) / Decimal(100)
    plot(*make_pqzo(a, 1 - 2*a, a), 2000)